#ifndef XUDP_H
#define XUDP_H

// udp
#include "xnet_err.h"
#include "xnet_tiny.h"
#include "xip.h"
#include "gdbinfo.h"

#define XUDP_CFG_MAX_UDP 10 // 最大支持的UDP连接数

// udp控制块
typedef struct _xudp_t xudp_t;
// udp的回调函数
typedef xnet_err_t (*xudp_handler_t)(xudp_t *udp, xipaddr_t *src_ip, uint16_t src_port, xnet_packet_t *packet);

struct _xudp_t
{
    enum
    {
        XUPD_STATE_FREE = 0, // udp未被使用
        XUDP_STATE_USED = 1, // udp已经被使用
    } state;
    uint16_t local_port; // 本地端口
    xudp_handler_t udp_handler;
};

xudp_t *xudp_open(xudp_handler_t handler);
void xudp_close(xudp_t *udp);
xnet_err_t xudp_bind(xudp_t *udp, uint16_t local_port);

#pragma(1)
//udp头部
typedef struct _xudp_hdr_t{
    uint16_t src_port;
    uint16_t dest_port;
    uint16_t total_len;
    uint16_t checksum; 
}xudp_hdr_t;
#pragma()

void xudp_init();
void xudp_in(xudp_t *udp, xipaddr_t *src_ip, xnet_packet_t *packet);
xnet_err_t xudp_out(xudp_t *udp,xipaddr_t *dest_ip,uint16_t dest_port,xnet_packet_t *packet);

#endif // XUDP_H
